#include <stdio.h>
#define MaxSize 10 //事先定义了数组最大长度属于是静态分配了

typedef struct
{					   //这个结构体的大小为max+1：数组长度再加上一个length
	int data[MaxSize]; //用静态数组存放元素
	int length;		   //顺序表的当前长度
} SqList;
//————————————————————关于操作的定义————————————————————————
//操作1：初始化一个顺序表
void InitList(SqList &L)
{				  //把&写道形参的位置是c++的语法，称为引用，这个时候操作L和主函数里边使用L等价的
				  /*	for(int i=0;i<MaxSize;i++){//将所有数据元素初始化为0，如果不初始化内存中会有脏数据 ，正常访问不到可以不做
						  L.data[i]=0;   			//初始化表长为0
					  }*/
	L.length = 0; //将表长设置为0！必做
}
//操作2：插入一个元素
bool ListInsert(SqList &L, int i, int e)
{
	if (i < 1 || i > L.length + 1)
	{
		return false; //判断：插入的范围是第一个前面到最后一个后面
	}
	if (L.length >= MaxSize)
	{
		return false; //判断：存满了 则返回false
	}
	for (int j = L.length; j >= i; j--)
	{ //依次后移
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
	return true;
}
//操作3：删除一个元素并且返回删除的值
bool ListDelete(SqList L, int i, int &e)
{
	// e是引用形变量，引用了我们自己定义的全局变量，如果没有&符号
	//那么函数就会在内部定义局部变量，改变也是改变的局部变量的值也就带不回来了
	if (i < 1 || i > L.length)
		return false;  //删除的范围也就是元素的范围
	e = L.data[i - 1]; //第i个位置对应数组的i-1号下标
	for (int j = i; j < L.length; j++)
	{
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}
//操作4：按位查找
int GetElem(SqList L, int i)
{
	if (i < 1 || i > L.length)
	{
		printf("非法位置");
		return 1;
	}
	else
		return L.data[i - 1];
}
//操作5：修改
bool GaiElem(SqList &L, int i, int e)
{
	if (i < 1 || i > L.length)
	{
		return false;
	}
	else
	{
		L.data[i - 1] = e;
	}
	return true;
}
//——————————主函数——————————————————————————
int main()
{
	SqList L;	 //声明一个顺序表
	bool ret;	 // 用来接受返回值
	int del;	 //用来存要删除的元素
	InitList(L); //初始化顺序表 （也就是把表长设置为零）
	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;
	L.length = 3;
	ListInsert(L, 1, 1); //插入元素  为什么这里传入的不是&L啊  为什么不带&  不用带回来吗？？？？？？？？？？？？？？为什么因为指针就是一个地址  定义要地址就给地址    c++封装好的不用加&了 -----c++就是这样定义的

	//删除测试-----------------
	/*	int e=-1;//用变量e把删掉的元素带回来
		if(ListDelete(L,3,e))
			printf("已经删除第三个元素，值为=%d\n",e);
		else
			printf("位序不合法，删除失败！\n");
		return 0;
	*/
	//插入测试----------------------
	ret = ListInsert(L, 2, 2);
	if (ret)
	{
		printf("插入成功！\n");
	}
	else
	{
		printf("插入失败！\n");
	}
	//查找测试----------------------
	int a = GetElem(L, 1);
	printf("GetElem的值为%d\n", a);

	/*顺序表遍历 ---------------
	for(int i=0;i<L.length;i++){
		printf("data[%d]=%d\n",i,L.data[i]);
	}
	*/
	return 0;
}
